<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 1. SyntaxError： 语法错误
        // var a = ;

        // 2. TypeError: 类型错误
        // var a = 1;
        // a();

        // 3. RangeError: 范围错误
        // let arr = new Array(-3);

        // 4. ReferenceError: 引用错误
        // var fm = 3;
        // console.log(fn);

        // js有处理错误的机制,js是单线程的，如果遇到错误了，后续代码不执行

        // try...catch

        try{
            // 将可能出错的代码，放在try中执行，如果出错，错误后的代码不执行，跳转到catch中执行，catch会收到错误对象，catch中的代码执行完毕之后，try。。catch语句执行完毕，执行后续代码

            // 如果try中的代码都执行完了还没有报错，则catch中的代码不执行，直接执行后续代码
            let fn = 888;
            console.log(fn);
            console.log('999');
        }catch(e){
            console.log('e: ', e);
        }
        console.log(123123);

        console.log('------------------')

        try{
            // throw[抛出]： 抛出异常，throw后续的代码不执行，直接跳转到catch中执行, e 接收到的就是throw的内容

           
            console.log('test throw');
            // throw 123;
            throw new Error('12123'); // new Error(错误信息)创建一个错误对象
            console.log('throw down');
        }catch(e){
            console.log('e:' , e);
        }

        console.log('-------------')
         // try 只能捕获非语法错误的错误, 因为js是解释型语言，执行之前先要进行语法检查，语法检查通过之后，代码从上到下执行
        try{
            // let a = ; // 不可以

            // new Array(-3); // 可以
            // let a = 1;// 可以
            // a();

            console.log(a);// 可以
        }catch(e){
            console.log('语法错误测试');
            console.log(e);
        }


    </script>
</body>

</html>